<?php
class TemplateCache {
    private static $cache_dir = 'cache/';
    
    /**
     * 渲染模板并缓存 - 静态方法
     * @param string $template_file 模板文件名
     * @param array $result 需要渲染的参数，默认为 $result
     * @param int $cache_time 缓存时间（分钟），默认60分钟
     * @return string 渲染后的内容
     */
    public static function render($template_file, $result = array(), $cache_time = 60) {
        // 创建缓存目录
        if (!is_dir(self::$cache_dir)) {
            mkdir(self::$cache_dir, 0755, true);
        }
        
        // 生成缓存文件名
        $cache_file = self::$cache_dir . 'tpl__' . basename($template_file, '.php') . '.cache';
        
        // 将分钟转换为秒
        $cache_time_seconds = $cache_time * 60;
        
        // 检查缓存是否存在且未过期
        if (file_exists($cache_file) && (time() - filemtime($cache_file)) < $cache_time_seconds) {
            return file_get_contents($cache_file) . "<!-- 来自缓存 -->";
        }
        
        // 缓存不存在或已过期，重新生成
        ob_start();
        
        // 将 $result 变量注入到模板中
        if (!empty($result)) {
            extract(['result' => $result]);
        }
        
        // 包含模板文件
        if (file_exists($template_file)) {
            include $template_file;
        } else {
            throw new Exception("模板文件不存在: " . $template_file);
        }
        
        // 获取输出内容
        $content = ob_get_clean();
        
        // 保存到缓存文件
        file_put_contents($cache_file, $content);
        
        return $content . "<!-- 新生成 -->";
    }
    
    /**
     * 删除指定模板的缓存
     */
    public static function clear($template_file) {
        $cache_file = self::$cache_dir . 'tpl__' . basename($template_file, '.php') . '.cache';
        if (file_exists($cache_file)) {
            return unlink($cache_file);
        }
        return true;
    }
    
    /**
     * 清空所有模板缓存
     */
    public static function clearAll() {
        $files = glob(self::$cache_dir . 'tpl__*.cache');
        $count = 0;
        foreach ($files as $file) {
            if (is_file($file)) {
                unlink($file);
                $count++;
            }
        }
        return $count;
    }
    
    /**
     * 获取缓存信息
     */
    public static function getCacheInfo($template_file = null) {
        if ($template_file) {
            $cache_file = self::$cache_dir . 'tpl__' . basename($template_file, '.php') . '.cache';
            if (file_exists($cache_file)) {
                $cache_time_seconds = 60 * 60; // 默认1小时
                $time_diff = time() - filemtime($cache_file);
                return [
                    'file' => $cache_file,
                    'size' => filesize($cache_file),
                    'size_kb' => round(filesize($cache_file) / 1024, 2) . ' KB',
                    'modified' => date('Y-m-d H:i:s', filemtime($cache_file)),
                    'expired' => $time_diff > $cache_time_seconds,
                    'remaining_minutes' => max(0, floor(($cache_time_seconds - $time_diff) / 60))
                ];
            }
            return null;
        } else {
            $files = glob(self::$cache_dir . 'tpl__*.cache');
            $info = [];
            foreach ($files as $file) {
                $cache_time_seconds = 60 * 60; // 默认1小时
                $time_diff = time() - filemtime($file);
                $info[] = [
                    'file' => $file,
                    'size' => filesize($file),
                    'size_kb' => round(filesize($file) / 1024, 2) . ' KB',
                    'modified' => date('Y-m-d H:i:s', filemtime($file)),
                    'expired' => $time_diff > $cache_time_seconds,
                    'remaining_minutes' => max(0, floor(($cache_time_seconds - $time_diff) / 60))
                ];
            }
            return $info;
        }
    }
    
    /**
     * 设置缓存目录（可选，如果不设置则使用默认的 cache/）
     */
    public static function setCacheDir($dir) {
        self::$cache_dir = rtrim($dir, '/') . '/';
        // 创建缓存目录
        if (!is_dir(self::$cache_dir)) {
            mkdir(self::$cache_dir, 0755, true);
        }
    }
    
    /**
     * 获取当前缓存目录
     */
    public static function getCacheDir() {
        return self::$cache_dir;
    }
}




// $data = [
//     '商品A',
//     '商品B', 
//     '商品C',
//     '商品F'
// ];
// $content = TemplateCache::render('fuck.tpl.php', $data, 0); // 缓存30分钟
// echo $content;




class DBCache {
    private static $cache_dir = 'cache/';
    
    /**
     * 获取缓存的数据库查询结果
     * @param string $sql SQL语句
     * @return mixed 缓存的数据，如果不存在或已过期返回false
     */
    public static function get($sql) {
        // 创建缓存目录
        if (!is_dir(self::$cache_dir)) {
            mkdir(self::$cache_dir, 0755, true);
        }
        
        // 生成缓存key
        $cache_key = md5($sql);
        $cache_file = self::$cache_dir . 'DB_' . $cache_key . '.cache';
        
        // 检查缓存文件是否存在
        if (!file_exists($cache_file)) {
            return false;
        }
        
        // 读取缓存数据
        $cache_data = unserialize(file_get_contents($cache_file));
        
        // 检查缓存是否有效
        if (!$cache_data || !isset($cache_data['expire_time']) || time() > $cache_data['expire_time']) {
            // 删除过期缓存
            unlink($cache_file);
            return false;
        }
        
        // 返回缓存的数据
        return $cache_data['data'];
    }
    
    /**
     * 设置数据库查询结果缓存
     *  $sql SQL语句
     *  $data 要缓存的数据
     *  $cache_time 缓存时间（分钟），默认60分钟
     *  是否缓存成功
     */

    public static function set($sql, $data, $cache_time = 60) {
        // 创建缓存目录
        if (!is_dir(self::$cache_dir)) {
            mkdir(self::$cache_dir, 0755, true);
        }
        
        // 生成缓存key
        $cache_key = md5($sql);
        $cache_file = self::$cache_dir . 'DB_' . $cache_key . '.cache';
        
        // 准备缓存数据
        $cache_data = [
            'data' => $data,
            'sql' => $sql,
            'cache_time' => time(),
            'expire_time' => time() + ($cache_time * 60),
            'cache_key' => $cache_key
        ];
        
        // 保存到缓存文件
        return file_put_contents($cache_file, serialize($cache_data)) !== false;
    }
    
    /**
     * 删除指定SQL的缓存
     * @param string $sql SQL语句
     * @return bool 是否删除成功
     */
    public static function delete($sql) {
        $cache_key = md5($sql);
        $cache_file = self::$cache_dir . 'DB_' . $cache_key . '.cache';
        if (file_exists($cache_file)) {
            return unlink($cache_file);
        }
        return true;
    }
    
    /**
     * 清空所有DB缓存
     * @return int 删除的缓存文件数量
     */
    public static function clearAll() {
        $files = glob(self::$cache_dir . 'DB_*.cache');
        $count = 0;
        foreach ($files as $file) {
            if (is_file($file)) {
                unlink($file);
                $count++;
            }
        }
        return $count;
    }
    
    /**
     * 设置缓存目录
     * @param string $dir 缓存目录路径
     */
    public static function setCacheDir($dir) {
        self::$cache_dir = rtrim($dir, '/') . '/';
        // 创建缓存目录
        if (!is_dir(self::$cache_dir)) {
            mkdir(self::$cache_dir, 0755, true);
        }
    }
}





$sql = "SELECT * FROM users WHERE status = 1 ORDER BY created_at DESC LIMIT 10";

// 直接获取缓存，如果存在且未过期就返回数据，否则返回false
$cached_data = DBCache::get($sql);


if ($cached_data !== false) {
    // 使用缓存数据
    echo "从缓存加载数据\n";
    foreach ($cached_data as $user) {
        echo "用户: " . $user['name'] . "\n";
    }
} else {
    echo "缓存不存在或已过期，需要执行数据库查询\n";
    
    // 执行数据库查询（这里用模拟数据）
    $data = [
        ['id' => 1, 'name' => '用户1', 'email' => 'user1@example.com'],
        ['id' => 2, 'name' => '用户2', 'email' => 'user2@example.com'],
        ['id' => 3, 'name' => '用户3', 'email' => 'user3@example.com']
    ];
    
    // 将查询结果缓存1分钟
    DBCache::set($sql, $data, 1);
    echo "数据已缓存\n";
}






    

